@@ -172,15 +172,17 @@ def lensman_photo_upload_api(request):  | 
            ||
| 172 | 172 | 
                group_id = group.group_id  | 
            
| 173 | 173 | 
                 | 
            
| 174 | 174 | 
                if photo and upload_lock(group_id, user_id, photo):  | 
            
| 175 | 
                - # 写 PhotosInfo 表  | 
            |
| 176 | 175 | 
                photo_info = file_save(photo, prefix='photo', ext='jpeg', watermark=True, thumbnail=True)  | 
            
| 177 | 176 | 
                 | 
            
| 177 | 
                + # 写 PhotosInfo 表  | 
            |
| 178 | 178 | 
                photo, created = PhotosInfo.objects.get_or_create(  | 
            
| 179 | 179 | 
                lensman_id=lensman_id,  | 
            
| 180 | 180 | 
                session_id=session_id,  | 
            
| 181 | 181 | 
                photo_id=photo_id,  | 
            
| 182 | 182 | 
                )  | 
            
| 183 | 
                + # 无水印  | 
            |
| 183 | 184 | 
                photo.m_photo_path = photo_info.photo_path  | 
            
| 185 | 
                + # 有水印  | 
            |
| 184 | 186 | 
                photo.p_photo_path = photo_info.photo_watermark_path  | 
            
| 185 | 187 | 
                photo.save()  | 
            
| 186 | 188 | 
                 | 
            
                @@ -233,7 +233,7 @@ FILE_UPLOAD_PERMISSIONS = 0o644 # TemporaryUploadedFile 文件权限设置  | 
            ||
| 233 | 233 | 
                CURTAIL_UUID_LENGTH = 7 # Used in django-curtail-uuid==1.0.0  | 
            
| 234 | 234 | 
                 | 
            
| 235 | 235 | 
                # 水印设置  | 
            
| 236 | 
                -WATERMARK_LOGO = os.path.join(PROJ_DIR, 'static/pai2/img/paiai_96_96.png').replace('\\', '/')
               | 
            |
| 236 | 
                +WATERMARK_LOGO = os.path.join(PROJ_DIR, 'static/pai2/img/paiai_water_mark.png').replace('\\', '/')
               | 
            |
| 237 | 237 | 
                 | 
            
| 238 | 238 | 
                # 原图设置  | 
            
| 239 | 239 | 
                LENSMAN_PHOTO_ORIGIN_EXPIRED_MSEL = 604800000 # 摄影师原图过期毫秒数,7d = 7 * 24 * 3600 * 1000msel  | 
            
                @@ -261,7 +261,7 @@ PAI2_TOURGUIDE_DOWNLOAD_IOS_PAGE_PATH = os.path.join(BASE_DIR, 'page/templates/p  | 
            ||
| 261 | 261 | 
                 | 
            
| 262 | 262 | 
                # 下载设置  | 
            
| 263 | 263 | 
                PAI2_USER_DOWNLOAD_WX_URL = 'https://pai.ai'  | 
            
| 264 | 
                -PAI2_USER_DOWNLOAD_IOS_URL = 'https://pai.ai'  | 
            |
| 264 | 
                +PAI2_USER_DOWNLOAD_IOS_URL = 'https://itunes.apple.com/cn/app/pai-aipaiai/id1163960351?mt=8'  | 
            |
| 265 | 265 | 
                 | 
            
| 266 | 266 | 
                PAI2_LENSMAN_DOWNLOAD_WX_URL = 'https://pai.ai'  | 
            
| 267 | 267 | 
                PAI2_LENSMAN_DOWNLOAD_IOS_URL = 'https://pai.ai'  | 
            
      
                @@ -178,7 +178,7 @@ def session_join_api(request):  | 
            ||
| 178 | 178 | 
                 | 
            
| 179 | 179 | 
                group_photo = None  | 
            
| 180 | 180 | 
                for photo in photos:  | 
            
| 181 | 
                - photo_info = file_save(photo_path=photo.p_photo_path, thumbnail=True)  | 
            |
| 181 | 
                + photo_info = file_save(photo_path=photo.p_photo_path, prefix='photo', ext='jpeg', thumbnail=True)  | 
            |
| 182 | 182 | 
                 | 
            
| 183 | 183 | 
                # 群组照片记录创建  | 
            
| 184 | 184 | 
                group_photo = GroupPhotoInfo.objects.create(  | 
            
      
      
                @@ -35,7 +35,7 @@ def file_save(file_=None, file_path=None, prefix='img', ext='jpeg', watermark=Fa  | 
            ||
| 35 | 35 | 
                # Photo UUID Get or Create  | 
            
| 36 | 36 | 
                photo, created = PhotoUUIDInfo.objects.select_for_update().get_or_create(photo_md5=photo_md5)  | 
            
| 37 | 37 | 
                 | 
            
| 38 | 
                - # 照片路径  | 
            |
| 38 | 
                + # 无水印  | 
            |
| 39 | 39 | 
                if not photo.photo_path:  | 
            
| 40 | 40 | 
                         photo_path = '{}/{}{}'.format(prefix, shortuuid.uuid(), ext)
               | 
            
| 41 | 41 | 
                if default_storage.exists(photo_path):  | 
            
                @@ -45,7 +45,7 @@ def file_save(file_=None, file_path=None, prefix='img', ext='jpeg', watermark=Fa  | 
            ||
| 45 | 45 | 
                photo.photo_path = photo_path  | 
            
| 46 | 46 | 
                photo.save()  | 
            
| 47 | 47 | 
                 | 
            
| 48 | 
                - # 水印  | 
            |
| 48 | 
                + # 有水印  | 
            |
| 49 | 49 | 
                if watermark:  | 
            
| 50 | 50 | 
                if not photo.photo_watermark_path:  | 
            
| 51 | 51 | 
                             photo_watermark_path = 'photo/{}{}'.format(shortuuid.uuid(), ext)
               | 
            
                @@ -80,6 +80,11 @@ def file_save(file_=None, file_path=None, prefix='img', ext='jpeg', watermark=Fa  | 
            ||
| 80 | 80 | 
                                 os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
               | 
            
| 81 | 81 | 
                settings.THUMBNAIL_MAX_WIDTH2  | 
            
| 82 | 82 | 
                )  | 
            
| 83 | 
                + watermark_wrap(  | 
            |
| 84 | 
                +                os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/'),
               | 
            |
| 85 | 
                + settings.WATERMARK_LOGO,  | 
            |
| 86 | 
                +                os.path.join(settings.MEDIA_ROOT, photo_thumbnail2_path).replace('\\', '/')
               | 
            |
| 87 | 
                + )  | 
            |
| 83 | 88 | 
                photo.photo_w = photo_w  | 
            
| 84 | 89 | 
                photo.photo_h = photo_h  | 
            
| 85 | 90 | 
                photo.photo_thumbnail2_path = photo_thumbnail2_path  | 
            
                @@ -17,46 +17,49 @@ def reduce_opacity(im, opacity):  | 
            ||
| 17 | 17 | 
                return im  | 
            
| 18 | 18 | 
                 | 
            
| 19 | 19 | 
                 | 
            
| 20 | 
                -def watermark(im, mark, position, opacity=1):  | 
            |
| 21 | 
                - """Adds a watermark to an image."""  | 
            |
| 20 | 
                +def watermark(im, mark, position, opacity=1, maxsize=(0, 0), possize=(0, 0)):  | 
            |
| 21 | 
                + """ Add watermark to image """  | 
            |
| 22 | 22 | 
                if opacity < 1:  | 
            
| 23 | 23 | 
                mark = reduce_opacity(mark, opacity)  | 
            
| 24 | 24 | 
                if im.mode != 'RGBA':  | 
            
| 25 | 25 | 
                         im = im.convert('RGBA')
               | 
            
| 26 | 
                - # create a transparent layer the size of the image and draw the  | 
            |
| 27 | 
                - # watermark in that layer.  | 
            |
| 26 | 
                + # Resize mark  | 
            |
| 27 | 
                + w, h = int(min(mark.size[0], maxsize[0]) if maxsize[0] else mark.size[0]), int(min(mark.size[1], maxsize[1]) if maxsize[1] else mark.size[1])  | 
            |
| 28 | 
                + mark = mark.resize((w, h))  | 
            |
| 29 | 
                + # Create a transparent layer the size of the image  | 
            |
| 30 | 
                + # Draw the watermark in that layer.  | 
            |
| 28 | 31 | 
                     layer = Image.new('RGBA', im.size, (0, 0, 0, 0))
               | 
            
| 29 | 32 | 
                if position == 'tile':  | 
            
| 30 | 33 | 
                for y in range(0, im.size[1], mark.size[1]):  | 
            
| 31 | 34 | 
                for x in range(0, im.size[0], mark.size[0]):  | 
            
| 32 | 35 | 
                layer.paste(mark, (x, y))  | 
            
| 33 | 36 | 
                elif position == 'scale':  | 
            
| 34 | 
                - # scale, but preserve the aspect ratio  | 
            |
| 35 | 
                - ratio = min(  | 
            |
| 36 | 
                - float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1])  | 
            |
| 37 | 
                - w = int(mark.size[0] * ratio)  | 
            |
| 38 | 
                - h = int(mark.size[1] * ratio)  | 
            |
| 37 | 
                + # Scale, but preserve the aspect ratio  | 
            |
| 38 | 
                + ratio = min(float(im.size[0]) / mark.size[0], float(im.size[1]) / mark.size[1])  | 
            |
| 39 | 
                + w, h = int(mark.size[0] * ratio), int(mark.size[1] * ratio)  | 
            |
| 40 | 
                + w, h = int(min(w, maxsize[0]) if maxsize[0] else w), int(min(h, maxsize[1]) if maxsize[1] else h)  | 
            |
| 39 | 41 | 
                mark = mark.resize((w, h))  | 
            
| 40 | 
                - layer.paste(mark, ((im.size[0] - w) / 2, (im.size[1] - h) / 2))  | 
            |
| 42 | 
                + layer.paste(mark, ((im.size[0] - possize[0] or w) / 2, (im.size[1] - possize[1] or h) / 2))  | 
            |
| 41 | 43 | 
                else:  | 
            
| 42 | 44 | 
                layer.paste(mark, position)  | 
            
| 43 | 
                - # composite the watermark with the layer  | 
            |
| 45 | 
                + # Composite the watermark with the layer  | 
            |
| 44 | 46 | 
                return Image.composite(layer, im, layer)  | 
            
| 45 | 47 | 
                 | 
            
| 46 | 48 | 
                 | 
            
| 47 | 49 | 
                def watermark_wrap(im_path, mark_path, save_path=''):  | 
            
| 48 | 50 | 
                im, mark = Image.open(im_path), Image.open(mark_path)  | 
            
| 49 | 
                - new_im = watermark(im, mark, (50, 50), 0.5)  | 
            |
| 51 | 
                + # new_im = watermark(im, mark, (50, 50), 0.5)  | 
            |
| 52 | 
                + new_im = watermark(im, mark, position='scale', opacity=1.0, maxsize=(400, 494.375), possize=(400, 400))  | 
            |
| 50 | 53 | 
                new_im.save(save_path or im_path)  | 
            
| 51 | 54 | 
                 | 
            
| 52 | 55 | 
                 | 
            
| 53 | 56 | 
                def watermark_test():  | 
            
| 54 | 
                -    im, mark = Image.open('original_CGzC_10a50000c8811190.jpg'), Image.open('paiai_96_96.png')
               | 
            |
| 55 | 
                - watermark(im, mark, 'tile', 0.5).show()  | 
            |
| 56 | 
                - watermark(im, mark, 'scale', 1.0).show()  | 
            |
| 57 | 
                - watermark(im, mark, (50, 50), 0.5).show()  | 
            |
| 57 | 
                +    im, mark = Image.open('original_CGzC_10a50000c8811190.jpg'), Image.open('paiai_water_mark.png')
               | 
            |
| 58 | 
                + watermark(im, mark, position='tile', opacity=0.5, maxsize=(40, 49.4375)).show()  | 
            |
| 59 | 
                + watermark(im, mark, position='scale', opacity=1.0, maxsize=(400, 494.375), possize=(400, 400)).show()  | 
            |
| 60 | 
                + watermark(im, mark, position=(50, 50), opacity=0.5, maxsize=(40, 49.4375)).show()  | 
            |
| 58 | 61 | 
                 | 
            
| 59 | 62 | 
                 | 
            
| 60 | 63 | 
                if __name__ == '__main__':  | 
            
| 61 | 64 | 
                # watermark_test()  | 
            
| 62 | 
                -    watermark_wrap('original_CGzC_10a50000c8811190.jpg', 'paiai_96_96.png')
               | 
            |
| 65 | 
                +    watermark_wrap('original_CGzC_10a50000c8811190.jpg', 'paiai_water_mark.png')
               |